본문으로 건너뛰기

03-050. 중복 데이터 처리

중복 데이터 처리

중복 데이터는 같은 정보가 여러 번 기록된 경우를 말한다. 중복 데이터도 해석을 왜곡한다.

중복 데이터 예시

고객ID이름나이성별연락처
C001홍길동35010-1234-5678
C002김미영28010-9876-5432
C001홍길동35010-1234-5678
C003이준호42010-5555-1234

이름 “홍길동”이 있는 행 2개는 중복이다. 상식적으로 동명이인이 존재할 수 있기 때문에 이름의 중복은 가능하지만 고객ID와 전화번호까지 동일한 것은 잘못된 것이다. 특별한 이유가 없다면 데이터 분석을 할 때는 중복은 제거해야 한다.

코드

import pandas as pd

# 예시 데이터 생성
data = {
'고객ID': ['C001', 'C002', 'C001', 'C003'],
'이름': ['홍길동', '김미영', '홍길동', '이준호'],
'나이': [35, 28, 35, 42],
'성별': ['남', '여', '남', '남'],
'연락처': ['010-1234-5678', '010-9876-5432', '010-1234-5678', '010-5555-1234']
}

df = pd.DataFrame(data)

print("중복 행 개수:", df.duplicated().sum())

# 중복 데이터 제거
df_clean = df.drop_duplicates()

# 특정 컬럼 기준으로 중복 제거
df_clean = df.drop_duplicates(subset=['고객ID'])

# 중복 데이터 유지 옵션 (첫 번째 또는 마지막 데이터 유지)
df_first = df.drop_duplicates(keep='first') # 첫 번째 유지
df_last = df.drop_duplicates(keep='last') # 마지막 유지

print("중복 제거한 후 개수:", df_last.shape[0])
print("중복 제거된 데이터:")
print(df_last)

실행 결과

중복 행 개수: 1
중복 제거한 후 개수: 3
중복 제거된 데이터:
고객ID 이름 나이 성별 연락처
1 C002 김미영 28 여 010-9876-5432
2 C001 홍길동 35 남 010-1234-5678
3 C003 이준호 42 남 010-5555-1234

Pandas의 duplicated() 메서드를 사용하면 중복된 갯수를 확인할 수 있다. drop_duplicates() 메서드를 사용하면 중복된 행을 제거할 수 있다. 중복을 행 전체로 하는 것은 실무에서는 잘 쓰지 않고 데이터의 특정 컬럼에 중복이 있는지 확인한다. 위의 데이터에서는 논리적으로 중복이 되면 안되는 고객ID, 연략처가 중복 체크의 대상이다. 위의 코드에서는 subset을 파라미터로 줘서 고객ID와 연락처를 중복 체크의 대상으로 지정했다.

그리고 중복을 제거한 수를 고유 원소수(Cardinality, 카디널리티)라고 하는데 데이터 분석과 기계학습에서도 중요하게 다루는 문제다. 데이터의 중복을 조사하거나 제거하면서 중복율이 얼마인지 확인해 두는 것도 중요하다.